home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr37 / wsomr100.zip / WSMAIL.C < prev    next >
C/C++ Source or Header  |  1995-03-15  |  8KB  |  338 lines

  1.  
  2. /*
  3.   ==========================================================================
  4.   wsmail.c by Frank Wang, Copyright 1995
  5.  
  6.   Functions:
  7.  
  8.     1. Post reply packets created by wsOMR.
  9.     2. Retrieve mails from system mail box
  10.  
  11.   Usage:
  12.  
  13.     Compile this program in the internet side using ff. commands:
  14.       cc wsmail.c
  15.       mv a.out wsmail
  16.  
  17.     To send replies:
  18.       wsmail r file_name
  19.  
  20.     To send replies and delete the reply file after sending
  21.       wsmail r- file_name
  22.  
  23.     To retrieve mails from system mail box and move to a new file:
  24.       wsmail m file_name
  25.  
  26.     To retrieve mails from system mail box and append to a new/existing file
  27.       wsmail m+ file_name
  28.  
  29.     To retrieve mails from system mail box without deleting:
  30.       wsmail M file_name
  31.  
  32.       wsmail M+ file_name
  33.  
  34.     Note: This program assumes max character per line is 512.
  35.   ==========================================================================
  36. */
  37.  
  38. #include <stdlib.h>
  39. #include <stdio.h>
  40. #include <string.h>
  41. #include <memory.h>
  42. #include <sys/types.h>
  43. #include <pwd.h>
  44.  
  45. #define MAX_NUM 512
  46. #define BUF_SIZE 512
  47. /*#define MAIL_SPOOL  "c:\\usenet\\"*/
  48. #define MAIL_SPOOL  "/usr/spool/mail/"
  49.  
  50. char *send_cmd  = "sendmail -t ";   /* change this in case different */
  51. char *temp_msg  = "temp.msg";       /* Temporary file for mail processed */
  52. char *wsomr_tag = "$WSOMR$";        /* Message seperating string         */
  53.  
  54. char user_mail[128];
  55. char home_dir[128];
  56.  
  57. /* -------------------------------- */
  58. /*  Read next line from the buffer  */
  59. /* -------------------------------- */
  60. next_line( f, buf, buf_siz, cnt, offset, ret_buf )
  61. FILE *f;
  62. char *buf;
  63. int buf_siz, *cnt, *offset;
  64. char *ret_buf;
  65. {
  66.   int ret = 0;
  67.  
  68.   memset( ret_buf, 0, buf_siz );
  69.   if (*offset < 0)                        /* first pass */
  70.   {
  71.     fseek( f, 0L, 0 );
  72.     *offset = *cnt = 0;
  73.   }
  74.   if (*offset == *cnt)                    /* at end of buffer ? */
  75.   {
  76.     memset( buf, 0, buf_siz );
  77.     *cnt = fread( buf, 1, buf_siz, f );   /* read the next block into buffer */
  78.     *offset = 0;
  79.   }
  80.   while ( *cnt > 0 )
  81.   {
  82.     int k, n;
  83.     char *p = buf + *offset;
  84.     for ( k = *offset, n = 0; *p && *p != '\n' && k < buf_siz; k ++, p++ )
  85.       n ++;
  86.  
  87.     /* If end of line or block */
  88.  
  89.     if ( k < buf_siz && (*p == '\n' || *p == 0) ) 
  90.     {
  91.       memcpy( ret_buf, buf + *offset, n );
  92.       ret_buf[n] = 0;
  93.       *offset = ++k;
  94.       ret = 1;
  95.       break;
  96.     }
  97.     else                                  /* The line is not ended in */
  98.     {                                     /* block, read the next block if any */
  99.       int new_siz = buf_siz - n;
  100.       memcpy( buf, buf + *offset, n );
  101.       memset( buf + n, 0, new_siz );
  102.       *cnt = fread( buf + n, 1, new_siz, f );
  103.       if ( *cnt == 0 )                    /* no more left in the file */
  104.       {                                   /* copy whatever left in the prv.blk*/
  105.         memcpy( ret_buf, buf + *offset, n );
  106.         ret_buf[n] = 0;
  107.       }
  108.       else
  109.       {
  110.         *cnt += n;
  111.         *offset = 0;
  112.       }
  113.     }
  114.   }
  115.   return ret;
  116. }
  117.  
  118. /* ------------------------------------------- */
  119. /*  Send mail using internet sendmail command  */
  120. /* ------------------------------------------- */
  121. send_mail( msg_no, to )
  122. int msg_no;
  123. char *to;
  124. {
  125.   int status;  char cmd[128];
  126.   sprintf( cmd, "%s <%s", send_cmd, temp_msg );
  127.   status  = system( cmd );
  128.   printf("\nMail # %2d, Status: %d, To:%s", msg_no, status, to );
  129. }
  130.  
  131. /* ------------------------------------------------------------- */
  132. /*  Scan wsOMR created reply file and send one mail at one time  */
  133. /* ------------------------------------------------------------- */
  134. post_all_mails( fname )
  135. char *fname;
  136. {
  137.   int ret = 0;
  138.   FILE *rep = fopen (fname, "rt");
  139.   if (NULL == rep )
  140.     fprintf (stderr, "can't open %s\n", fname );
  141.   else
  142.   {
  143.     FILE *out;
  144.     char buffer[MAX_NUM], ret_buf[MAX_NUM], name[128];
  145.     int cnt, offset = -1, done, msg_no, valid_msg, apnd, end_of_msg;
  146.     cnt = done = apnd = msg_no = valid_msg = end_of_msg = 0;
  147.     while (!done)
  148.     {
  149.       if (!apnd)
  150.       {
  151.         if (NULL == (out = fopen (temp_msg, "wt")))
  152.         {
  153.           fprintf (stderr, "can't create %s\n", temp_msg );
  154.           exit (0);
  155.         }
  156.         apnd = 1;
  157.         end_of_msg = valid_msg = 0;
  158.         memset( name, 0, sizeof(name) );
  159.       }
  160.       done = !next_line( rep, buffer, sizeof(buffer), &cnt, &offset, ret_buf );
  161.       if (!done)
  162.       {
  163.         if ( strncmp( ret_buf, wsomr_tag, strlen(wsomr_tag) ) )
  164.         {
  165.           fwrite( ret_buf, 1, strlen(ret_buf), out );
  166.           fwrite( "\n", 1, 1, out );
  167.           if (!valid_msg)
  168.           {
  169.             valid_msg = strncmp( ret_buf, "To:", 3 ) == 0;
  170.             if (valid_msg)
  171.               strcpy( name, ret_buf + 3 );
  172.           }
  173.         }
  174.         else
  175.           end_of_msg = 1;
  176.       }
  177.       if ( (apnd && valid_msg) && (done || end_of_msg) )
  178.       {
  179.         fclose( out );
  180.         msg_no ++;
  181.         send_mail( msg_no, name );
  182.         apnd = end_of_msg = valid_msg = 0;
  183.       }
  184.     }
  185.     if ( apnd )      /* invalid message encountered */
  186.       fclose( out );
  187.     printf("\n");
  188.     fclose( rep );
  189.   }
  190.   return ret;
  191. }
  192.  
  193. /*
  194.   ---------------------------------------
  195.     Retrieve user info from UNIX system
  196.   ---------------------------------------
  197. */
  198. set_param()
  199. {
  200.   struct passwd *pw;
  201.   if (NULL == (pw = getpwuid(getuid())))
  202.   {
  203.     fprintf ( stderr, "can't determin user info\n");
  204.     return 0;
  205.   }
  206.   else
  207.   {
  208.     strcpy ( user_mail, MAIL_SPOOL );
  209.     strcat ( user_mail, pw -> pw_name );
  210.     strcpy ( home_dir,  pw -> pw_dir );
  211.     return 1;
  212.   }
  213. }
  214.  
  215. /*
  216.   --------------------------------------------------------
  217.     Move personal mail from system mail box to file_name
  218.   --------------------------------------------------------
  219. */
  220. get_mail( file_name, read_only, is_append )
  221. char *file_name;
  222. int read_only, is_append;
  223. {
  224.   int  done = 0;
  225.   long fsize = 0;
  226.   FILE *mail, *folder;
  227.   char *mode = is_append ? "ab" : "wb";
  228.  
  229.   /* Open user's mail file */
  230.   if (NULL == (mail = fopen (user_mail, "rb")))
  231.   {
  232.     fprintf ( stderr, "\ncan't open %s\n", user_mail );
  233.     return 0;
  234.   }
  235.   else
  236.   {
  237.     fseek( mail, 0L, 2 );
  238.     if ( !ftell(mail) )
  239.     {
  240.       fprintf ( stderr, "\nmail box is empty\n" );
  241.       fclose(mail);
  242.       return 0;
  243.     }
  244.     else
  245.       rewind(mail);
  246.   }
  247.  
  248.   if (NULL == (folder = fopen (file_name, mode )))
  249.   {
  250.     fprintf ( stderr, "\ncan't create %s\n", file_name );
  251.     return 0;
  252.   }
  253.  
  254.   /* Copy */
  255.   while (!done)
  256.   {
  257.     unsigned char buffer[BUF_SIZE];
  258.     int  rcount, wcount;
  259.     rcount = fread( buffer, 1, sizeof(buffer), mail );
  260.     done = rcount < sizeof(buffer);
  261.     wcount = fwrite( buffer,1, rcount, folder );
  262.     if ( wcount != rcount )
  263.     {
  264.       fprintf (stderr, "Error in writing file \n", file_name );
  265.       return 0;
  266.     }
  267.     fsize += wcount;
  268.   }
  269.   fclose (mail);
  270.   fclose (folder);
  271.  
  272.   if (!read_only)
  273.   {
  274.     if (NULL == (mail = fopen (user_mail, "wb")))
  275.       fprintf (stderr, "can't write %s\n", user_mail );
  276.     else
  277.       fclose (mail);
  278.   }
  279.   return (fsize);
  280. }
  281.  
  282. void syntax()
  283. {
  284.   printf( "Postman for wsOMR by Frank Wang\n" );
  285.   printf( "\nSyntax: wsmail [rm] file_name" );
  286.   printf( "\n        r  post reply(file_name)" );
  287.   printf( "\n        r- post reply(file_name) and delete afterwards" );
  288.   printf( "\n        m  copy mails to file_name" );
  289.   printf( "\n        m+ append mails to file_name" );
  290.   printf( "\n        M  copy mails(read only) to file_name" );
  291.   printf( "\n        M+ append mails(read only) to file_name" );
  292.   printf( "\n" );
  293. }
  294.  
  295. main( argc, argv )
  296. int argc;
  297. char *argv[];
  298. {
  299.   int ret = 1;
  300.   char *param, *file_name;
  301.  
  302.   if ( argc > 2 )
  303.   {
  304.     char optn, mode;
  305.     param     = argv[1];
  306.     file_name = argv[2];
  307.  
  308.     optn = param[0];
  309.     mode = param[1];    /* optional switch */
  310.  
  311.     if ( optn == 'r' )
  312.     {
  313.       post_all_mails( file_name );
  314.       if ( mode == '-' )
  315.         unlink( file_name );
  316.       ret = 0;
  317.     }
  318.     else if ( optn == 'm' || optn == 'M' )
  319.     {
  320.       if ( set_param() )
  321.       {
  322.         long siz = get_mail(file_name, optn == 'M', mode == '+' );
  323.         if ( siz > 0 )
  324.         {
  325.           printf( "\nmails packed into %s (%u characters)\n", file_name, siz );
  326.           ret = 0;
  327.         }
  328.       }
  329.     }
  330.     else
  331.       syntax();
  332.   }
  333.   else
  334.     syntax();
  335.   exit(ret);
  336. }
  337.  
  338.